package com.robert.demo.config.filter;


import com.robert.demo.common.utils.AesUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * AuthIdInterceptor:
 *
 * @author zhaoshengtao
 * @date 2024/03/21
 */
@Slf4j
public class AuthIdInterceptor implements HandlerInterceptor {

    // 模拟接口配置字段
    private static final Map<String, String> PARAM_CONFIG_MAP = new HashMap<>();
    // 模拟配置文件中的url
    private static final List<String> IGNORE_URL = Collections.singletonList("case/query");
    static {
        // 同一个url可以同时配置 多个参数， 用逗号分割
        PARAM_CONFIG_MAP.put("case/query", "caseId");
    }
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        // 先判断接口是否需要拦截
        String requestUri = request.getRequestURI();
        // 过滤出配置的url
        String flag = IGNORE_URL.stream().filter(requestUri::contains).findFirst().orElse(null);
        if(StringUtils.isNotEmpty(flag)){
            // 获取url配置的字段名称
            String paramFieldStr = PARAM_CONFIG_MAP.get(flag);
            if(StringUtils.isNotEmpty(paramFieldStr)){
                // 分组
                String[] split = paramFieldStr.split(",");
                Map<String, String> paramFieldMap = new HashMap<>();
                for (String string : split) {
                    String id = request.getParameter(string);
                    paramFieldMap.put(string, id);
                }
                // 获取请求中的参数值
                if (!paramFieldMap .isEmpty()) {
                    if (isValid(paramFieldMap, request)) {
                        return true;
                    } else {
                        // 处理无效caseId的情况，比如设置错误状态码，写入响应信息等
                        response.sendError(HttpServletResponse.SC_BAD_REQUEST, "无权限.");
                        return false;
                    }
                }
                // 参数异常
                response.sendError(HttpServletResponse.SC_BAD_REQUEST, "请求参数异常.");
                return false;
            }
        }
        // 如果不需要拦截，直接放行
        return true;
    }

    // 示例方法，实际中你需要实现caseId的有效性检查
    private boolean isValid(Map<String, String> paramFieldMap, HttpServletRequest request) {
        // 实现caseId有效性验证逻辑
        // 模拟当前用户
        int userId = 1;
        // 解密字符串
        try {
            // 多参数同时满足
            for (Map.Entry<String, String> entry : paramFieldMap.entrySet()) {
                String[] info = AesUtil.getInfo( entry.getValue());
                // 这里暂时只比较userid，完整版可以比较业务类型
                if(info != null && info[1].equals(String.valueOf(userId))){
                    // 将解密后的业务ID设置到请求request中
                    request.setAttribute(entry.getKey(),info[0]);
                }else{
                    return false;
                }
            }
            return true;
        }catch (Exception e){
            log.error(e.getMessage(), e);
            return false;
        }

    }
}
